	package mx.itesm.escenas;

import mx.itesm.constants.ConstantesEscenas;
import mx.itesm.manejadores.ManejadorEscenas;
import mx.itesm.manejadores.ManejadorRecursos;

import org.andengine.engine.handler.timer.ITimerCallback;
import org.andengine.engine.handler.timer.TimerHandler;
import org.andengine.entity.scene.menu.MenuScene;
import org.andengine.entity.scene.menu.MenuScene.IOnMenuItemClickListener;
import org.andengine.entity.scene.menu.item.IMenuItem;
import org.andengine.entity.scene.menu.item.SpriteMenuItem;
import org.andengine.entity.scene.menu.item.decorator.ScaleMenuItemDecorator;

public class EscenaMenu extends EscenaBase implements IOnMenuItemClickListener {
	
	/*
	 * **************************************************************
	 *                                         Variables
	 * **************************************************************
	 */
	
	// Variables a utilizar
	protected MenuScene mEscenaMenu;
	private static final int ORIGEN = ConstantesEscenas.ORIGEN;
	
	// Posicion de los botones
	private static final int ABOUT_X = ConstantesEscenas.ABOUT_X;
	private static final int ABOUT_Y = ConstantesEscenas.ABOUT_Y;
	private static final int PLAY_X = ConstantesEscenas.PLAY_X;
	private static final int PLAY_Y = ConstantesEscenas.PLAY_Y;
	private static final int SETTINGS_X = ConstantesEscenas.SETTINGS_X;
	private static final int SETTINGS_Y = ConstantesEscenas.SETTINGS_Y;
	private static final int SCORES_X = ConstantesEscenas.SCORES_X;
	private static final int SCORES_Y = ConstantesEscenas.SCORES_Y;
	private static final int INSTRUC_X = ConstantesEscenas.INSTRUC_X;
	private static final int INSTRUC_Y = ConstantesEscenas.INSTRUC_Y;
	
	
	// Botones del Menu (diferentes opciones)
	private final int MENU_PLAY = 0;
	private final int MENU_SETTINGS = 1;
	private final int MENU_INSTRUC = 2;
	private final int MENU_SCORES = 3;
	private final int MENU_ABOUT = 4;
	
	// Crea la escena del menu
	@Override
	public void crearEscena() {
		attachChild(createSprite(ORIGEN, ORIGEN, manejadorRecursos.mainMenuRegion,
				mVerticesObjetos));
		
		//Cargamos los botones del menu
		ManejadorRecursos.getInstance().cargarRecursosBotones();
		crearMenuPrincipal();
	}
	
	//Crea el Menu Principal con todas sus posibles opciones
	public void crearMenuPrincipal() {
		mEscenaMenu = new MenuScene(camara);
		mEscenaMenu.setBackgroundEnabled(true);
		mEscenaMenu.setPosition(ORIGEN, ORIGEN);
		
		final IMenuItem playMenuBoton = new ScaleMenuItemDecorator(new SpriteMenuItem (
				MENU_PLAY, manejadorRecursos.botonPlayRegion, mVerticesObjetos), 1.2f, 1);
		final IMenuItem aboutMenuBoton = new ScaleMenuItemDecorator(new SpriteMenuItem(
				MENU_ABOUT, manejadorRecursos.botonAboutRegion, mVerticesObjetos), 1.2f, 1);
		final IMenuItem settingsMenuBoton = new ScaleMenuItemDecorator(new SpriteMenuItem (
				MENU_SETTINGS, manejadorRecursos.botonSettingsRegion, mVerticesObjetos), 1.2f, 1);
		 final IMenuItem scoresMenuBoton = new ScaleMenuItemDecorator(new SpriteMenuItem(
				 MENU_SCORES, manejadorRecursos.botonScoresRegion, mVerticesObjetos), 1.2f, 1);
		 final IMenuItem instructMenuBoton = new ScaleMenuItemDecorator(new SpriteMenuItem (
				 MENU_INSTRUC, manejadorRecursos.botonInstrucRegion, mVerticesObjetos), 1.2f, 1);
		
		mEscenaMenu.addMenuItem(aboutMenuBoton);
		mEscenaMenu.addMenuItem(settingsMenuBoton);
		mEscenaMenu.addMenuItem(playMenuBoton);
		mEscenaMenu.addMenuItem(instructMenuBoton);
		mEscenaMenu.addMenuItem(scoresMenuBoton);
		
		mEscenaMenu.buildAnimations();
		mEscenaMenu.setBackgroundEnabled(false);
		
		aboutMenuBoton.setPosition(ABOUT_X, ABOUT_Y);
		settingsMenuBoton.setPosition(SETTINGS_X, SETTINGS_Y);
		playMenuBoton.setPosition(PLAY_X, PLAY_Y);
		scoresMenuBoton.setPosition(SCORES_X, SCORES_Y);
		instructMenuBoton.setPosition(INSTRUC_X, INSTRUC_Y);
		
		mEscenaMenu.setOnMenuItemClickListener(this);
		setChildScene(mEscenaMenu);
	}
	
	// Tipo de escena
	@Override
	public TipoEscena getTipoEscena() {
		return TipoEscena.ESCENA_MENU;
	}
	
	// Al presionar la tecla de atras... salir del juego
	@Override
	public void onBackKeyPressed() {
		System.exit(0);
	}
	
	@Override
	public void removerEscena() {
		this.detachSelf();
		this.dispose();
	}
	
	//Cuando el jugador toca alguna opcion del menu en la pantalla
	@Override
	public boolean onMenuItemClicked(MenuScene pMenuScene, IMenuItem pMenuItem,
			float pMenuItemLocalX, float pMenuItemLocalY) {
		
		switch(pMenuItem.getID()) {
		
		case MENU_PLAY:
			
			ManejadorEscenas.getInstance().cargarEscenaLoading();
			ManejadorEscenas.getInstance().setEscena(TipoEscena.ESCENA_CARGAR);
			ManejadorEscenas.getInstance().descargarEscenaMenu();

			engine.registerUpdateHandler(new TimerHandler(0.2f, new ITimerCallback() {

				@Override
				public void onTimePassed(final TimerHandler pTimerHandler) {

					engine.unregisterUpdateHandler(pTimerHandler);
					ManejadorEscenas.getInstance().cargarEscenaElegirPersonaje();
				}
			}));

			return true;
			
		case MENU_SETTINGS:
			ManejadorEscenas.getInstance().cargarEscenaSettings();
			return true;
			
		case MENU_INSTRUC:
			ManejadorEscenas.getInstance().cargarEscenaInstructions();
			return true;
			
		case MENU_SCORES:
			ManejadorEscenas.getInstance().cargarEscenaScores();
			return true;
		
		case MENU_ABOUT:
			ManejadorEscenas.getInstance().cargarEscenaAbout();
			return true;
			
		default:
			return false;
		}
	}
}
